    // Copyright (C) 2010  Davis E. King (davis@dlib.net)
    // License: Boost Software License   See LICENSE.txt for the full license.
    #undef DLIB_CROSS_VALIDATE_REGRESSION_TRaINER_ABSTRACT_Hh_
    #ifdef DLIB_CROSS_VALIDATE_REGRESSION_TRaINER_ABSTRACT_Hh_

    #include <vector>
    #include "../matrix.h"

    namespace dlib
    {

    // ----------------------------------------------------------------------------------------

        template <
            typename reg_funct_type,
            typename sample_type,
            typename label_type
            >
        matrix<double,1,4>
        test_regression_function (
            reg_funct_type& reg_funct,
            const std::vector<sample_type>& x_test,
            const std::vector<label_type>& y_test
        );
        /*!
            requires
                - is_learning_problem(x_test, y_test)
                - reg_funct_type == some kind of regression function object
                  (e.g. a decision_function created by the svr_trainer )
            ensures
                - Tests reg_funct against the given samples in x_test and target values in
                  y_test and returns a matrix M summarizing the results.  Specifically:
                    - M(0) == the mean squared error.
                      The MSE is given by: sum over i: pow(reg_funct(x_test[i]) - y_test[i], 2.0)
                    - M(1) == the correlation between reg_funct(x_test[i]) and y_test[i].
                      This is a number between -1 and 1.
                    - M(2) == the mean absolute error.
                      This is given by: sum over i: abs(reg_funct(x_test[i]) - y_test[i])
                    - M(3) == the standard deviation of the absolute error.
        !*/

    // ----------------------------------------------------------------------------------------

        template <
            typename trainer_type,
            typename sample_type,
            typename label_type
            >
        matrix<double,1,4>
        cross_validate_regression_trainer (
            const trainer_type& trainer,
            const std::vector<sample_type>& x,
            const std::vector<label_type>& y,
            const long folds
        );
        /*!
            requires
                - is_learning_problem(x,y)
                - 1 < folds <= x.size()
                - trainer_type == some kind of regression trainer object (e.g. svr_trainer)
            ensures
                - Performs k-fold cross validation by using the given trainer to solve a
                  regression problem for the given number of folds.  Each fold is tested using
                  the output of the trainer.  A matrix M summarizing the results is returned.
                  Specifically:
                    - M(0) == the mean squared error.
                      The MSE is given by: sum over i: pow(reg_funct(x[i]) - y[i], 2.0)
                    - M(1) == the correlation between a predicted y value and its true value.
                      This is a number between -1 and 1.
                    - M(2) == the mean absolute error.
                      This is given by: sum over i: abs(reg_funct(x_test[i]) - y_test[i])
                    - M(3) == the standard deviation of the absolute error.
        !*/

    }

    // ----------------------------------------------------------------------------------------

    #endif // DLIB_CROSS_VALIDATE_REGRESSION_TRaINER_ABSTRACT_Hh_